package jmine.tec.web.userInputFilter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import jmine.tec.web.servlet.BeanFactoryServletFilter;

/**
 * Filtro de Servlet que aplica filtros de entrada registrados no {@link UserInputFilterHolder}
 * 
 * @author pedro
 */
public class InputContentServletFilter extends BeanFactoryServletFilter {
    private static final String FILTER_HOLDER = "userInputFilterHolder";

    private String filterHolderName;

    private UserInputFilterHolder filterHolder;

    /**
     * Método responsável por iniciar o filtro
     * 
     * @param filterConfig {@link FilterConfig}
     * @throws ServletException Caso ocorra algum problema
     */
    @Override
    public void initialize(FilterConfig filterConfig) throws ServletException {
        this.filterHolderName = this.getParameter(filterConfig, FILTER_HOLDER, FILTER_HOLDER);
    }

    /**
     * Não faz nada.
     */
    public void destroy() {
        // Não faz nada
    }

    /**
     * Aplica o filtro propriamente dito
     * 
     * @param servletRequest {@link ServletRequest}
     * @param servletResponse {@link ServletResponse}
     * @param filterChain {@link FilterChain}
     * @throws ServletException Caso ocorra algum erro
     * @throws IOException Caso ocorra algum erro
     */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,
            ServletException {
        this.getFilterHolder().filterInput(servletRequest);

        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * Devolve o UserFilterHolder
     * 
     * @return o UserFilterHolder
     */
    private UserInputFilterHolder getFilterHolder() {
        if (this.filterHolder == null) {
            this.filterHolder = this.getBean(this.filterHolderName, UserInputFilterHolder.class);
        }
        return this.filterHolder;
    }

    /**
     * @param filterHolder the filterHolder to set
     */
    public void setFilterHolder(UserInputFilterHolder filterHolder) {
        this.filterHolder = filterHolder;
    }
}
